/*
 * Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


package it.unipd.dei.bd.icineasti.servlet.admin;

import it.unipd.dei.bd.icineasti.servlet.AbstractDatabaseServlet;

import it.unipd.dei.bd.icineasti.database.GetEventoDatabase;
import it.unipd.dei.bd.icineasti.database.CreaOAggiornaEventoOFilmDatabase;
import it.unipd.dei.bd.icineasti.resource.Evento;
import it.unipd.dei.bd.icineasti.resource.Film;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Date;
import java.util.List;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import java.util.HashMap;
import java.util.Iterator;
import java.text.SimpleDateFormat;

import org.apache.commons.lang3.StringEscapeUtils; 

/**
 * Servlet per il caricamento dei dettagli di un evento per la pagina scheda_evento
 * Necessita del parametro d'ingresso codiceEvento
 * 
 * @author Mattia Coccato
 *
 */
public class GestioneEventoServlet extends AbstractDatabaseServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {

		// imposta il tipo MIME della risposta
		res.setContentType("application/json;charset=utf-8");

		// ottiene un flusso di uscita per scrivere la risposta
		PrintWriter out = res.getWriter();

		Connection con = null;

		try {
			con = DS.getConnection();
			Evento evento = null;
			int codiceEvento = Integer.parseInt(req.getParameter("codiceEvento"));
			evento = new GetEventoDatabase(con, codiceEvento, false).getEvento();
			
			//stampo array in formato json
			out.printf("{");
			
			out.printf("\"codice\": \"%s\", ", evento.getCodice());
			//out.printf("\" \"%s\"; ", evento.getLocandina());
			out.printf("\"titolo\": \"%s\", ", StringEscapeUtils.escapeHtml4(evento.getTitolo()));
			out.printf("\"descrizione\": \"%s\", ", StringEscapeUtils.escapeHtml4(evento.getDescrizione()));
			out.printf("\"durataInSala\": \"%s\", ", evento.getDurataInSala());
			out.printf("\"durataProiezione\": \"%s\", ", evento.getDurataProiezione());

			if (evento instanceof Film) {
				out.printf("\"isFilm\": \"true\", "); 
				out.printf("\"trama\": \"%s\", ", StringEscapeUtils.escapeHtml4(((Film)evento).getTrama()));
				out.printf("\"genere\": \"%s\", ", StringEscapeUtils.escapeHtml4(((Film)evento).getGenere()));
				out.printf("\"regia\": \"%s\", ", StringEscapeUtils.escapeHtml4(((Film)evento).getRegia()));
				out.printf("\"castPrincipale\": \"%s\", ", StringEscapeUtils.escapeHtml4(((Film)evento).getCastPrincipale()));
				out.printf("\"urlTrailer\": \"%s\", ", StringEscapeUtils.escapeHtml4(((Film)evento).getUrlTrailer()));
				//out.printf("\"dataUscita\":  \"%s\", ", new SimpleDateFormat("dd/MM/YYYY").format(((Film)evento).getDataUscita()));
				out.printf("\"dataUscita\":  \"%s\", ", new SimpleDateFormat("yyyy-MM-dd").format(((Film)evento).getDataUscita()));
				out.printf("\"is3D\": \"%s\" ", ((Film)evento).getIn3D());
			} else 
				out.printf("\"isFilm\": \"false\" "); 

		} catch (NullPointerException e) {
			// messaggio d'errore
			out.printf("<p class=\"errore\">Impossibile creare la connessione al database.</p>");
		} catch (SQLException e) {
			// messaggio d'errore
			out.printf("<p class=\"errore\">Errore durante l'accesso al database: %s</p>",
			e.getMessage());
			e.printStackTrace();
		} 
		
		out.printf("}");

		// assicura che tutto il contenuto sia inviato
		out.flush();

		// chiude il flusso di uscita
		// out.close();

	}


	public void doPost(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {

		res.setContentType("text/html");

		PrintWriter out = res.getWriter();

		String idAsString = null; 

		Integer codice = null;
		int durataProiezione, durataInSala;
		java.sql.Date dataUscita = null;

		try {
			//if (datiForm.containsKey("codice"))
			if (req.getParameter("codice") != null && (req.getParameter("codice").length() > 0))
				codice = Integer.parseInt(req.getParameter("codice"));
		} catch (NumberFormatException e) {
			out.printf("<p class\"errore\">Errore conversione parametro %s: %s</p>",
					"codice", e.getMessage());
			return;
		}
		
		try {
			durataProiezione = Integer.parseInt(req.getParameter("durataProiezione"));
		} catch (NumberFormatException e) {
			out.printf("<p class\"errore\">Errore conversione parametro %s: %s</p>",
					"durataProiezione", e.getMessage());
			return;
		}

		try {	
			durataInSala = Integer.parseInt(req.getParameter("durataInSala"));
		} catch (NumberFormatException e) {
			out.printf("<p class\"errore\">Errore conversione parametro %s: %s</p>",
					"durataInSala", e.getMessage());
			return;
		}

		try {
			if (req.getParameter("isFilm").toLowerCase().equals("true"))
				dataUscita = new java.sql.Date(new SimpleDateFormat("yyyy-MM-dd").parse(req.getParameter("dataUscita")).getTime());
		} catch (Exception e) {
			out.printf("<p class\"errore\">Errore conversione parametro %s: %s</p>",
					"dataUscita", e.getMessage());
			return;
		}

		Connection conn;
		
		try {
			conn = DS.getConnection();

			Evento evento = null;
			
			if (req.getParameter("isFilm").toLowerCase().equals("true")) 
				evento = new Film ((codice == null)? 0 : codice,
							null,
							req.getParameter("titolo"),
							durataInSala,
							durataProiezione,
							req.getParameter("trama"),
							req.getParameter("genere"),
							req.getParameter("regia"),
							req.getParameter("castPrincipale"),
							req.getParameter("urlTrailer"),
							dataUscita,
							false);
			else
				evento = new Evento ((codice == null)? 0 :codice,
							null,
							req.getParameter("titolo"),
							req.getParameter("descrizione"),
							durataInSala,
							durataProiezione);

			CreaOAggiornaEventoOFilmDatabase operatore = new CreaOAggiornaEventoOFilmDatabase(conn, evento);

			if (codice == null) {
				//non ho ancora un codice, va inserito come nuovo
				codice = operatore.inserisciEvento();
				out.printf("<p class=\"ok\">Inserito correttamente!</p><script type=\"text/javascript\">$(\"#codice\").attr(\"value\",\"%s\");</script>", codice);
			} else {
				//si tratta di una modifica
				operatore.aggiornaEvento();
				out.printf("<p class=\"ok\">Salvato correttamente!</p>");
			}
			
		} catch (Exception e) {
			out.printf("<p class\"errore\">Errore generale: %s</p>", e.getMessage());
			return;
		}
	}

}
